package com.itheima.Log;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class PrintLog {

    @Pointcut("execution(* com.itheima.service.impl.*.*(..))")
    public void pt(){}

    @Around("pt()")
    public Object methodTime(ProceedingJoinPoint pjp) throws Throwable {
        Object proceed = null;
        try {
            // 获取毫秒值
            long startT = System.currentTimeMillis();
            // 执行目标方法
            // 如果发生了异常 你这边给catch 意味着你自己给处理掉这个异常了
            // 异常就不会再往上抛了 到这里异常就结束了 Spring框架就检测不到异常
            proceed = pjp.proceed();
            long endT = System.currentTimeMillis();
            System.out.println(pjp.getSignature().getDeclaringTypeName()+"类中的"+pjp.getSignature().getName()+"方法执行时间是:"+(endT-startT)+"毫秒");
            return proceed;
        } catch (Throwable throwable) {
            //throwable.printStackTrace();
            System.out.println("异常通知/// 在发生异常的时候做增强");
            throw throwable;
        } finally {
            System.out.println("最终通知....");
        }
    }
}
